package com.cg.design.graphicdesignpattern.factory.framework;

/**
 * 工厂抽象类
 *
 * @program: LeetCode->Factory
 * @description: 工厂抽象类
 * @author: cg
 * @create: 2022-03-19 14:51
 **/
public abstract class Factory {

    /**
     * 调用抽象方法的模板方法
     * final意思是模板方法不允许子类重写
     * @param owner 产品拥有者
     * @return 返回生成的产品
     */
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    /**
     * 生成产品的抽象方法
     * @param owner 产品拥有者
     * @return 返回生成的产品
     */
    protected abstract Product createProduct(String owner);

    /**
     * 注册产品的抽象方法
     * @param product 被注册的产品
     */
    protected abstract void registerProduct(Product product);

}
